home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 38 / Amiga Format CD38 (1999-03-15)(Future Publishing)(GB)(Track 1 of 3)[!][issue 1999-04].iso / -seriously_amiga- / programming / other / cyberxxxsrc / misc / yuvstuff.mod < prev   
Text File  |  1999-02-08  |  13KB  |  248 lines

  1. MODULE  YUVStuff;
  2.  
  3. (* $StackChk- $OvflChk- $RangeChk- $CaseChk- $ReturnChk- $NilChk- $TypeChk- $OddChk- $ClearVars- *)
  4.  
  5. (* /// ------------------------------- "IMPORT" -------------------------------- *)
  6. IMPORT  e:=Exec,
  7.         ol:=OberonLib,
  8.         y:=SYSTEM;
  9. (* \\\ ------------------------------------------------------------------------- *)
  10.  
  11. (* /// -------------------------------- "CONST" -------------------------------- *)
  12. CONST   maxJSample=255;
  13.         centerJSample=128;
  14. (* \\\ ------------------------------------------------------------------------- *)
  15.  
  16. (* /// -------------------------------- "TYPE" --------------------------------- *)
  17. TYPE    YUVTab * =ARRAY 256 OF LONGINT;
  18.         YUVTablePtr * =UNTRACED POINTER TO YUVTable;
  19.         YUVTable * =STRUCT
  20.             ubTab * : YUVTab;
  21.             vrTab * : YUVTab;
  22.             ugTab * : YUVTab;
  23.             vgTab * : YUVTab;
  24.             yTab * : YUVTab;
  25.         END;
  26.  
  27.         YUVBufferPtr * =UNTRACED POINTER TO YUVBuffer;
  28.         YUVBuffer * =STRUCT
  29.             yBuf * : e.LSTRPTR;
  30.             uBuf * : e.LSTRPTR;
  31.             vBuf * : e.LSTRPTR;
  32.         END;
  33.  
  34.         RangeLimit=ARRAY 5*(maxJSample+1)+centerJSample OF CHAR;
  35.         RangeLimitPtr * =UNTRACED POINTER TO RangeLimit;
  36.  
  37.         RemapTable * =ARRAY 256 OF STRUCT
  38.             alpha * : CHAR;
  39.             red * : CHAR;
  40.             green * : CHAR;
  41.             blue * : CHAR;
  42.         END;
  43.         RemapTablePtr * =UNTRACED POINTER TO RemapTable;
  44. (* \\\ ------------------------------------------------------------------------- *)
  45.  
  46. (* /// --------------------------------- "VAR" --------------------------------- *)
  47. VAR     sampLimit: RangeLimitPtr;
  48.         rngLimit: RangeLimitPtr;
  49.         yuvTab: YUVTablePtr;
  50.         yuvBuf: YUVBufferPtr;
  51. (* \\\ ------------------------------------------------------------------------- *)
  52.  
  53. (* /// ------------------------- "PROCEDURE AddPtr()" -------------------------- *)
  54. PROCEDURE AddPtr(ptr: e.APTR;
  55.                  inc: LONGINT): e.APTR;
  56. BEGIN
  57.   RETURN y.VAL(e.APTR,y.VAL(LONGINT,ptr)+inc);
  58. END AddPtr;
  59. (* \\\ ------------------------------------------------------------------------- *)
  60.  
  61. (* /// --------------------- "PROCEDURE InitLimitTables()" --------------------- *)
  62. PROCEDURE InitLimitTablesNew(): RangeLimitPtr;
  63.  
  64. VAR     table: RangeLimitPtr;
  65.         cnt: INTEGER;
  66.         off: INTEGER;
  67.  
  68. BEGIN
  69.   IF sampLimit=NIL THEN
  70.     NEW(sampLimit);
  71.     table:=sampLimit;
  72.     rngLimit:=y.VAL(RangeLimitPtr,y.VAL(LONGINT,sampLimit)+maxJSample+1);
  73.     sampLimit^:=RangeLimit("\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  74.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  75.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  76.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  77.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  78.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  79.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  80.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  81.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  82.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  83.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  84.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  85.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  86.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  87.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  88.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  89.                            "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F"
  90.                            "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"
  91.                            "\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F"
  92.                            "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3B\x3C\x3D\x3E\x3F"
  93.                            "\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4A\x4B\x4C\x4D\x4E\x4F"
  94.                            "\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5A\x5B\x5C\x5D\x5E\x5F"
  95.                            "\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6A\x6B\x6C\x6D\x6E\x6F"
  96.                            "\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7A\x7B\x7C\x7D\x7E\x7F"
  97.                            "\x80\x81\x82\x83\x84\x85\x86\x87\x88\x89\x8A\x8B\x8C\x8D\x8E\x8F"
  98.                            "\x90\x91\x92\x93\x94\x95\x96\x97\x98\x99\x9A\x9B\x9C\x9D\x9E\x9F"
  99.                            "\xA0\xA1\xA2\xA3\xA4\xA5\xA6\xA7\xA8\xA9\xAA\xAB\xAC\xAD\xAE\xAF"
  100.                            "\xB0\xB1\xB2\xB3\xB4\xB5\xB6\xB7\xB8\xB9\xBA\xBB\xBC\xBD\xBE\xBF"
  101.                            "\xC0\xC1\xC2\xC3\xC4\xC5\xC6\xC7\xC8\xC9\xCA\xCB\xCC\xCD\xCE\xCF"
  102.                            "\xD0\xD1\xD2\xD3\xD4\xD5\xD6\xD7\xD8\xD9\xDA\xDB\xDC\xDD\xDE\xDF"
  103.                            "\xE0\xE1\xE2\xE3\xE4\xE5\xE6\xE7\xE8\xE9\xEA\xEB\xEC\xED\xEE\xEF"
  104.                            "\xF0\xF1\xF2\xF3\xF4\xF5\xF6\xF7\xF8\xF9\xFA\xFB\xFC\xFD\xFE\xFF"
  105.                            "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  106.                            "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  107.                            "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  108.                            "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  109.                            "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  110.                            "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  111.                            "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  112.                            "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  113.                            "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  114.                            "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  115.                            "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  116.                            "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  117.                            "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  118.                            "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  119.                            "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  120.                            "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  121.                            "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  122.                            "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  123.                            "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  124.                            "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  125.                            "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  126.                            "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  127.                            "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  128.                            "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"
  129.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  130.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  131.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  132.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  133.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  134.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  135.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  136.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  137.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  138.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  139.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  140.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  141.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  142.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  143.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  144.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  145.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  146.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  147.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  148.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  149.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  150.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  151.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  152.                            "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
  153.                            "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0A\x0B\x0C\x0D\x0E\x0F"
  154.                            "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1A\x1B\x1C\x1D\x1E\x1F"
  155.                            "\x20\x21\x22\x23\x24\x25\x26\x27\x28\x29\x2A\x2B\x2C\x2D\x2E\x2F"
  156.                            "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x3A\x3B\x3C\x3D\x3E\x3F"
  157.                            "\x40\x41\x42\x43\x44\x45\x46\x47\x48\x49\x4A\x4B\x4C\x4D\x4E\x4F"
  158.                            "\x50\x51\x52\x53\x54\x55\x56\x57\x58\x59\x5A\x5B\x5C\x5D\x5E\x5F"
  159.                            "\x60\x61\x62\x63\x64\x65\x66\x67\x68\x69\x6A\x6B\x6C\x6D\x6E\x6F"
  160.                            "\x70\x71\x72\x73\x74\x75\x76\x77\x78\x79\x7A\x7B\x7C\x7D\x7E\x7F");
  161.   END;
  162.   RETURN rngLimit;
  163. END InitLimitTablesNew;
  164. (* \\\ ------------------------------------------------------------------------- *)
  165.  
  166. (* /// --------------------- "PROCEDURE InitLimitTables()" --------------------- *)
  167. PROCEDURE InitLimitTables * (): RangeLimitPtr;
  168.  
  169. VAR     table: RangeLimitPtr;
  170.         cnt: INTEGER;
  171.         off: INTEGER;
  172.  
  173. BEGIN
  174.   IF sampLimit=NIL THEN
  175.     NEW(sampLimit);
  176.     rngLimit:=AddPtr(sampLimit,maxJSample+1);
  177.     table:=sampLimit;
  178.     FOR cnt:=0 TO maxJSample DO table[cnt]:=00X; END;
  179.     table:=AddPtr(sampLimit,maxJSample+1);
  180.     FOR cnt:=0 TO maxJSample DO table[cnt]:=CHR(cnt); END;
  181.     table:=AddPtr(table,centerJSample);
  182.     FOR cnt:=centerJSample TO 2*(maxJSample+1)-1 DO table[cnt]:=CHR(maxJSample); END;
  183.  
  184.     FOR cnt:=2*(maxJSample+1) TO 4*(maxJSample+1)-centerJSample-1 DO table[cnt]:=00X; END;
  185.     off:=4*(maxJSample+1)-centerJSample;
  186.     FOR cnt:=4*(maxJSample+1)-centerJSample TO 4*(maxJSample+1)-1 DO table[cnt]:=sampLimit[maxJSample+1+cnt-off]; END;
  187.   END;
  188.   RETURN rngLimit;
  189. END InitLimitTables;
  190. (* \\\ ------------------------------------------------------------------------- *)
  191.  
  192. (* /// --------------------- "PROCEDURE AllocMCUBuffers()" --------------------- *)
  193. PROCEDURE AllocMCUBuffers * (w: LONGINT;
  194.                              h: LONGINT): YUVBufferPtr;
  195.  
  196. CONST   dctSize=64;
  197.  
  198. BEGIN
  199.   IF yuvBuf=NIL THEN
  200.     NEW(yuvBuf);
  201.   ELSE
  202.     DISPOSE(yuvBuf.yBuf);
  203.     DISPOSE(yuvBuf.uBuf);
  204.     DISPOSE(yuvBuf.vBuf);
  205.   END;
  206.   w:=((w+15) DIV 16)*4;
  207.   h:=(h+15) DIV 16;
  208.   IF ODD(h) THEN INC(h); END;
  209.   ol.New(yuvBuf.yBuf,w*dctSize);
  210.   ol.New(yuvBuf.uBuf,w*dctSize);
  211.   ol.New(yuvBuf.vBuf,w*dctSize);
  212.   RETURN yuvBuf;
  213. END AllocMCUBuffers;
  214. (* \\\ ------------------------------------------------------------------------- *)
  215.  
  216. (* /// ---------------------- "PROCEDURE GenYUVTables()" ----------------------- *)
  217. PROCEDURE GenYUVTables * (): YUVTablePtr;
  218.  
  219. VAR     ub: e.FLOAT;
  220.         vr: e.FLOAT;
  221.         ug: e.FLOAT;
  222.         vg: e.FLOAT;
  223.         cnt: LONGINT;
  224.         x: e.FLOAT;
  225.  
  226. BEGIN
  227.   IF yuvTab=NIL THEN
  228.     NEW(yuvTab);
  229.     ub:=(1.77200/2)*64+0.5;
  230.     vr:=(1.40200/2)*64+0.5;
  231.     ug:=(0.34414/2)*64+0.5;
  232.     vg:=(0.71414/2)*64+0.5;
  233.     FOR cnt:=0 TO 255 DO
  234.       x:=2*cnt-255;
  235.       yuvTab.ubTab[cnt]:=ENTIER(ub*x+32);
  236.       yuvTab.vrTab[cnt]:=ENTIER(vr*x+32);
  237.       yuvTab.ugTab[cnt]:=ENTIER(-ug*x);
  238.       yuvTab.vgTab[cnt]:=ENTIER(-vg*x+32);
  239.       yuvTab.yTab[cnt]:=y.LSH(cnt,6)+y.LSH(cnt,-2);
  240.     END;
  241.   END;
  242.   RETURN yuvTab;
  243. END GenYUVTables;
  244. (* \\\ ------------------------------------------------------------------------- *)
  245.  
  246. END YUVStuff.
  247.  
  248.